/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sistemasdistribuidos;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 *
 * @author rafaelc
 * Classe responsável por criar um servidor para uma porta especificada,
 * o mesmo envia e recebe informações do cliente atraves dos metodos sendStr e recvStr.
 */
public class Server implements Comunicacao{

    private Socket sock = null;
  
    /**
     * Método que realiza a criação do ssrvidor e estabelece
     * a comunicação entre este e o cliente;
     * Parâmetros: nenhum.
     */
    public void execuçãoServer(){

       while(true){
                       
            ServerSocket serverSock = null;
            try{
            //Criando serverSocket na porta 25
            serverSock = new ServerSocket(24);

            //Criando socket cliente
            sock = serverSock.accept();
            System.out.println("Porta no servidor: " + sock.getPort());
            
            //Canal para receber dados do cliente 
            String informacaoDoCliente = recvStr();
            
            if (informacaoDoCliente == null){
                System.out.println("Cliente nao respondeu");
            }else{
                System.out.println("String vinda do cliente:\n" + informacaoDoCliente);
                
                sendStr("\nO servidor recebeu essa informacao: "+informacaoDoCliente +
                        "\n e devolve esta: " + informacaoDoCliente.toUpperCase());
                
            }
            
            }catch(IOException e){
                System.out.println("Erro ao criar o servidor ou ao receber informacao do cliente");
            }finally{
            //Fecha o socket
            
            try{
            
            sock.close();

            //Fecha o serverSocket
            serverSock.close();
                }catch(IOException e){
                 System.out.println("Alguma exception ao fechar o servidor");
                }
            }// end-finaly
        } // end while
    }
 
    /*Envia a String s para o cliente 
     que estiver conectado ao servidor
     * Parâmetro: String s representando a informação
     * a ser repassada para o cliente.
     * Retorno: void.
     */
   
    public void sendStr(String s){
        try{
            
            DataOutputStream dos = new DataOutputStream(sock.getOutputStream());
            
            dos.writeUTF(s);
            
            //System.out.println("\n'S' Dentro do sendStr: " + s);
        } catch (IOException e) {
                //não possue serviço
                System.out.println("Erro dentro do sendStr do Sniffer\n");
            }
        }
    
 /* Recebe informações do(s) cliente(s) através de um DataInputStream
  * Retorno: String s que contém a informação enviada pelo cliente 
  */

 public String recvStr(){
        String res = null;        
        try{
        DataInputStream dis = new DataInputStream(sock.getInputStream());
                        res = dis.readUTF();
        }catch(UnknownHostException e){
                System.err.print(e);
                System.out.println("\nErro1 no recvStr do Server");
            }
            catch(IOException e){
                //não possue serviço
                System.out.println("\nErro2 no recvStr do Server");
            }
        return res;
    }
}

